package laboratorio3;
/**
 * @author ROGER DIAZ
 */

//utilizo esta libreria para poder trabajar con pilas
import java.util.Stack;
    
//implementacion de iCalculadora.java
public class Postfix implements iCalculadora{
    
    //Declaro que las pilas seran tipo String porque si no declaro quedan como tipo objeto 
    //y no puedo operarlas.
    Stack <String> pila1 = new Stack();
    Stack <String> pila2 = new Stack();
    Stack <String> pila3 = new Stack();  
    
public Postfix(){
}    
    
//Este metodo hace el push de los caracteres a la pila, se va a usar en el main
public void push(String item){
pila1.push(item);
}

//Este metodo es el que hace todo el proceso de calculo Postfix
//este se va a ir usando por cada linea 
public void operar(){
    int cantpila2=0;
    
    //mientras hayan valores en la pila 1, la cual se uso para guardar lo que se extrajo de una X linea
    //se entra al ciclo para ver que hacer con los valores que hayan
    while(pila1.empty()==false){
        
        //entonces primero se saca de la pila uno para ver que es y operarlo
        String termino = pila1.pop();

                    //si es el signo de suma
        if(termino.equals("+")){
                        //se necesita que por lo menos hayan dos cosas para operar en la pila 2 
                        //por lo que se controla con esta variable            
            while(cantpila2>=2){
                //se saca un valor y se hace entero
            int num1=Integer.parseInt(pila2.pop());
            //se saca el otro valor y se hace entero
            int num2=Integer.parseInt(pila2.pop());
            //se operan
            int total= num1 + num2;
            //se guarda otra vez en pila dos para operarlo con lo que venga
            pila2.push(Integer.toString(total));
            //se le resta al contador ya que dos valores se hacen uno en la operacion
            cantpila2--;
            }
        }
                    //si es el signo de resta
            else if(termino.equals("-")){
                        //se necesita que por lo menos hayan dos cosas para operar en la pila 2 
                        //por lo que se controla con esta variable                
                    while(cantpila2>=2){
                     //se saca un valor y se hace entero
                    int num1=Integer.parseInt(pila2.pop());
                    //se saca el otro valor y se hace entero
                    int num2=Integer.parseInt(pila2.pop());
                    //se operan
                    int total= num1 - num2;
                    //se guarda otra vez en pila dos para operarlo con lo que venga
                    pila2.push(Integer.toString(total));
                    //se le resta al contador ya que dos valores se hacen uno en la operacion
                    cantpila2--;
                }
            }    
                    //si es el signo de multiplicacion
                else if(termino.equals("*")){
                        //se necesita que por lo menos hayan dos cosas para operar en la pila 2 
                        //por lo que se controla con esta variable                    
                   while(cantpila2>=2){
                    //se saca un valor y se hace entero
                    int num1=Integer.parseInt(pila2.pop());
                    //se saca el otro valor y se hace entero
                    int num2=Integer.parseInt(pila2.pop());
                    //se operan
                       int total= num1 * num2;
                       //se guarda otra vez en pila dos para operarlo con lo que venga
                       pila2.push(Integer.toString(total));
                        //se le resta al contador ya que dos valores se hacen uno en la operacion
                       cantpila2--;
                   } 
                } 
                    //si es el signo de division
                    else if(termino.equals("/")){
                        //se necesita que por lo menos hayan dos cosas para operar en la pila 2 
                        //por lo que se controla con esta variable
                    while(cantpila2>=2){
                    //se saca un valor y se hace entero
                    int num1=Integer.parseInt(pila2.pop());
                    //se saca el otro valor y se hace entero
                    int num2=Integer.parseInt(pila2.pop());
                    //se operan
                        int total= num1 / num2;
                        //se guarda otra vez en pila dos para operarlo con lo que venga
                        pila2.push(Integer.toString(total));
                        //se le resta al contador ya que dos valores se hacen uno en la operacion
                        cantpila2--;
                    }        
                    }
                    //si es otra cosa, que se espera que sea un numero
                        else{
                        try{
                            //se verifica si es numero al tratar de convertirlo
                            int esnumero=Integer.parseInt(termino);
                            //suponiendo que no da error en la conversion se comprueba
                            //por lo que se guarda
                            pila2.push(termino);
                            //se aumenta la cantidad de numeros que tiene pila dos
                            cantpila2++;
                        }
                        catch(Exception e){
                        }
                        }
         }
    //al haber trabajado todo lo que habia en la linea lo manda a la pila 3 que es donde estaran
    //los resultados de cada linea
    pila3.push(pila2.pop());
}


//Este metodo va a ir imprimiendo el resultado de cada una de las lineas
    public void imprimirPila(){
        
        //aqui en pila 3 se mandaron los resultados de todos los calculos por los que se van sacando hasta que
        //esta pila quede vacia
    while(pila3.empty()==false){
        
    //pila1.push(pila3.pop());
        //voy imprimiendo cada uno de los valores que voy sacando de pila 3
        //como los voy usando ya no quedan en la pila
    System.out.println(pila3.pop());
    }
}

}
